package com.xiaozhu.ai_config;

import com.xiaozhu.common.aiconstant.SystemConstants;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.InMemoryChatMemory;
import org.springframework.ai.chat.prompt.ChatOptions;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * CommonConfiguration
 *
 * Spring Boot 通用配置类。
 * 主要用于：
 * 1. 创建 AI 聊天组件相关的 Bean；
 * 2. 注入聊天记忆 ChatMemory；
 * 3. 定义 ChatClient 默认的系统提示与日志功能。
 *
 * 使用场景：
 * 该类会被 Spring Boot 在启动时自动扫描，
 * 让 Controller 或 Service 层可以直接注入 ChatClient 调用 AI 模型。
 *
 * 作者：朱慧军
 * 版本：1.0
 */
@Configuration // 声明这是一个 Spring 配置类（等价于传统 XML 配置）
public class CommonConfiguration {

    /**
     * ChatMemory Bean
     *
     * ChatMemory 是 Spring AI 中用于存储对话上下文（历史消息）的接口。
     * InMemoryChatMemory 是它的默认内存实现，保存在 JVM 内存中。
     * 该 Bean 会在项目启动时被注册进 Spring 容器。
     *  a.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatIdStr);
     *  可以根据会话id将聊天内存存储在内存中，但是一旦服务器重新启动就会全部清除
     * @return InMemoryChatMemory 实例对象
     */
    @Bean
    public ChatMemory chatMemory() {
        // 创建一个基于内存的对话存储容器
        return new InMemoryChatMemory();
    }

    /**
     * SpringAi内置日志
     * @return
     */
    @Bean
    public SimpleLoggerAdvisor simpleLoggerAdvisor() {
        return new SimpleLoggerAdvisor();
    }

    /**
     * ChatClient Bean
     *
     * ChatClient 是 Spring AI 提供的高层次客户端，用于与模型交互。
     * 通过注入 OllamaChatModel，可以与本地 Ollama 模型进行对话。
     *
     * 默认配置：
     * - 使用 Ollama 模型；
     * - 添加系统提示（让 AI 以“小朱同学”的身份回答）；
     * - 使用 SimpleLoggerAdvisor 记录每次请求日志。
     *
     * @param model OllamaChatModel 模型对象，由 Spring 自动注入
     * @return ChatClient 聊天客户端对象
     */
    @Bean
    public ChatClient chatClient(OllamaChatModel model) {
        return ChatClient.builder(model)

                .defaultOptions(ChatOptions.builder().model("deepseek-r1:7b").build())
                // 设置 AI 的默认“系统角色”提示信息，让回复更符合个性化语气
                .defaultSystem(SystemConstants.XIAO_ZHU_SYSTEM_PROMPT)
                // 配置一个日志顾问（Advisor），可在控制台打印对话日志
                .defaultAdvisors(new SimpleLoggerAdvisor(),
                        new MessageChatMemoryAdvisor(chatMemory()))
                // 构建最终的 ChatClient 实例
                .build();
    }
}
